/* ==================================================================   
 * Created [2009-4-27 下午11:32:55] by Jon.King 
 * ==================================================================  
 * TSS 
 * ================================================================== 
 * mailTo:jinpujun@hotmail.com
 * Copyright (c) Jon.King, 2009-2012 
 * ================================================================== 
*/

package com.jinhe.tss.core.cachepool.container;

import java.util.List;

import com.jinhe.tss.core.cachepool.Cacheable;
import com.jinhe.tss.core.cachepool.CacheableKey;


/** 
 * <p> AbstractPoolContainer.java </p> 
 * 
 * @author Jon.King 2007-1-3
 *
 */
public abstract class AbstractPoolContainer implements IPoolContainer {
    
    protected String name;

    public AbstractPoolContainer(String name) {
        this.name = name;
    }

    public abstract Cacheable get(Object key);
  
    public Cacheable getByAccessMethod(int accessMethod){
        Cacheable item = null;
        List<CacheableKey> keys = getKeys();
        switch(accessMethod){   
        case ACCESS_LRU:
            long lastAccessed = 999999999;
            for(CacheableKey key : keys){
                Cacheable temp = get(key);
                long life = System.currentTimeMillis() - temp.getAccessed();
                if(life < lastAccessed){
                    lastAccessed = life;
                    item = temp; // 找出最近使用的
                }
            }
            break;
        case ACCESS_LFU:
            int minHit = 999999999;
            for(CacheableKey key : keys){
                Cacheable temp = get(key);
                if(minHit < temp.getHit()){
                    minHit = temp.getHit();
                    item = temp; // 找出最不常使用的
                }
            }
            break;
        case ACCESS_RANDOM:
            item = get(keys.get((int)(keys.size() * Math.random()))); // 随机
            break;
        case ACCESS_FIFO:
            item = get(keys.get(0));
            break;
        case ACCESS_LIFO:
        default:
            item = get(keys.get(keys.size() - 1));
        }
        return item;
    }
    
    public Cacheable removeByAccessMethod(int accessMethod){
        Cacheable o = getByAccessMethod(accessMethod);
        return remove(o.getKey());
    }

    public abstract Cacheable put(Object key, Cacheable value);

    public abstract Cacheable remove(Object key);

    public abstract List<CacheableKey> getKeys();

    public abstract int size();
    
    public abstract void clear();
    
    public String toString(){
        StringBuffer sb = new StringBuffer("\n--------------------------(" + name + ")池中数据项列表 -----------------------\n");
        for(CacheableKey key : getKeys()){
            Cacheable cacheableItem = get(key);
            if(cacheableItem != null) {
            	Object value = cacheableItem.getValue();
                sb.append("key : ").append(key.getKey()).append(" , value : ").append(value).append("\n");
            }
        }
        return sb.append("------------------------------------------------------------------------------").toString();
    }
}

